/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package miage.sessions.ecom;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.CreateException;
import javax.ejb.EJB;
import javax.ejb.FinderException;
import javax.ejb.Stateless;
import miage.beans.CategoriePresentation;
import miage.beans.ClientPresentation;
import miage.beans.FacturePresentation;
import miage.beans.MagasinPresentation;
import miage.beans.ProduitPresentation;
import miage.entities.Client;
import miage.entities.Facture;
import miage.entities.Magasin;
import miage.entities.Produit;
import miage.sessions.ecom.remote.EcomCustomerRemote;
import miage.sessions.nonPersistant.*;
import miage.sessions.persistant.*;


/**
 *
 * @author Pepito
 */

@Stateless (mappedName="ecomCustomer")
public class EcomCustomer implements EcomCustomerRemote, Serializable {
    @EJB
    private AccountClientFacadeLocal accountClientFacade = new AccountClientFacade();
    @EJB
    private AccountProductStoreFacadeLocal accountProductStoreFacade;
    @EJB    
    private ProductFacadeLocal productFacade;
    @EJB
    private FactureFacadeLocal factureFacade;
    @EJB
    private EuroConvertor convertor;
    @EJB
    private Cart cart;
    
    private List<Produit> produits;
    private Produit produit;
    
    private List<Magasin> magasins;
    private Magasin magasin;

    private List<Facture> factures;
    private Facture facture;
    
    private Client accountClient;
    //private static int nbfacture=6;
    
    @Override
    public ClientPresentation getAuthentification(String login, String password)throws FinderException, RemoteException {        
        accountClient = accountClientFacade.getClientByAuthentification(login, password);
        return new ClientPresentation(accountClient.getIbanClient(),accountClient.getNom(),accountClient.getPrenom(),accountClient.getPassword(),accountClient.getLogin(),accountClient.getEmail(),accountClient.getAdresseClient(),accountClient.getCodepostalClient(),accountClient.getVilleClient(),accountClient.getSolde(),accountClient.getFlagClientAdmin());
    }
    @Override
    public List<MagasinPresentation> getAllMagasin()throws FinderException, RemoteException{
        magasins = accountProductStoreFacade.getAllMagasins();
        List<MagasinPresentation> allMagasin = new ArrayList<MagasinPresentation>();
        for(Magasin cust:magasins ) {
            allMagasin.add(new MagasinPresentation(cust.getIbanStore(),cust.getNomStore(),cust.getReferenceStore(),cust.getAdresseStore(),cust.getCodepostalStore(),cust.getVilleStore(),cust.getSolde()));
        }    
        return allMagasin;
    }    
    @Override
    public List<CategoriePresentation> getAllCategorie()throws FinderException, RemoteException{
        List<String> cat = productFacade.getAllCategorieOfProduct();
        List<CategoriePresentation> allCategorie = new ArrayList<CategoriePresentation>();
        for(int i=0; i<cat.size(); i++) {
            allCategorie.add(new CategoriePresentation(cat.get(i)));
        }    
        return allCategorie;
    }    
    @Override
    public List<ProduitPresentation> getAllProduitByCategorie(String categorie)throws FinderException, RemoteException{
        produits = productFacade.getAllProductByCategorie(categorie);
        List<ProduitPresentation> allProduit = new ArrayList<ProduitPresentation>();
        for(Produit cust:produits ) {
            allProduit.add(new ProduitPresentation(cust.getReferenceProduit(),cust.getNomProduit(),cust.getReferenceStore().getReferenceStore(),cust.getImageProduit(),cust.getDescriptionProduit(),cust.getCategorieProduit(),(int)cust.getQuantite(),cust.getPrixProduit()));
        }
        return allProduit;
    }
    @Override
    public MagasinPresentation getMagasin(String reference_store)throws FinderException, RemoteException{
        magasin = accountProductStoreFacade.getMagasin(reference_store);
        return new MagasinPresentation(magasin.getIbanStore(),magasin.getNomStore(),magasin.getReferenceStore(),magasin.getAdresseStore(),magasin.getCodepostalStore(),magasin.getVilleStore(),magasin.getSolde());
    }
    @Override
    public void addClient(ClientPresentation client)throws CreateException, FinderException, RemoteException{
        accountClientFacade.addClient(client);
    }
    @Override
    public ClientPresentation getClient(String login, String password)throws FinderException, RemoteException{
        accountClient = accountClientFacade.getClientByAuthentification(login, password);
        return new ClientPresentation(accountClient.getIbanClient(),accountClient.getNom(),accountClient.getPrenom(),accountClient.getPassword(),accountClient.getLogin(),accountClient.getEmail(),accountClient.getAdresseClient(),accountClient.getCodepostalClient(),accountClient.getVilleClient(),accountClient.getSolde(),accountClient.getFlagClientAdmin());
    }
    @Override
    public void deleteClient(String login, String password)throws FinderException, RemoteException{
        accountClientFacade.deleteClient(login,password);
    }
    @Override
    public void updateClient(ClientPresentation client)throws FinderException, RemoteException{
        
        System.out.println("update client methode");
        System.out.println(client.toString());
        System.out.println("client client");
        accountClientFacade.updateClient(client);
    }
    
    @Override
    public List<ProduitPresentation> getAllProduitByMagasin(String reference_store)throws FinderException, RemoteException{
        System.out.println("on entre dans la fonction getallproduitbymagasin");
        produits = productFacade.getAllProduitByMagasin(reference_store);
        List<ProduitPresentation> allProduit = new ArrayList<ProduitPresentation>();
        for(Produit cust:produits ) {
            allProduit.add(new ProduitPresentation(cust.getReferenceProduit(),cust.getNomProduit(),cust.getReferenceStore().getReferenceStore(),cust.getImageProduit(),cust.getDescriptionProduit(),cust.getCategorieProduit(),(int)cust.getQuantite(),cust.getPrixProduit()));
        }
        System.out.println("on sort de la méthode");
        return allProduit;
    }
    @Override
    public List<ProduitPresentation> getAllProduitByName(String nom_produit)throws FinderException, RemoteException{
        produits = productFacade.getProduitByName(nom_produit);
        List<ProduitPresentation> allProduit = new ArrayList<ProduitPresentation>();
        for(Produit cust:produits ) {
            allProduit.add(new ProduitPresentation(cust.getReferenceProduit(),cust.getNomProduit(),cust.getReferenceStore().getReferenceStore(),cust.getImageProduit(),cust.getDescriptionProduit(),cust.getCategorieProduit(),(int)cust.getQuantite(),cust.getPrixProduit()));
        }
        return allProduit;
    }    
    
    @Override
    public List<ProduitPresentation> getAllProduitByPrix(double prixmax)throws FinderException, RemoteException{
        produits = productFacade.getAllProductByPrix(prixmax);
        List<ProduitPresentation> allProduit = new ArrayList<ProduitPresentation>();
        for(Produit cust:produits ) {
            allProduit.add(new ProduitPresentation(cust.getReferenceProduit(),cust.getNomProduit(),cust.getReferenceStore().getReferenceStore(),cust.getImageProduit(),cust.getDescriptionProduit(),cust.getCategorieProduit(),(int)cust.getQuantite(),cust.getPrixProduit()));
        }
        return allProduit;
    } 
    
   
    
    @Override
    public ProduitPresentation getProduitByReferenceProduit(String reference_produit)throws FinderException, RemoteException{
        produit = productFacade.getProduitByReferenceProduit(reference_produit);
        return new ProduitPresentation(produit.getReferenceProduit(),produit.getNomProduit(),produit.getReferenceStore().getReferenceStore(),produit.getImageProduit(),produit.getDescriptionProduit(),produit.getCategorieProduit(),(int)produit.getQuantite(),produit.getPrixProduit());
    }
 
    @Override
    public double getConvertToEuro(double montant, String symbole){
        return (convertor.convertToEuro(montant, symbole));
    }
    @Override
    public double getConvertFromEuro(double montant, String symbole) {
        return (convertor.convertFromEuro(montant, symbole));
    }
    
    
    @Override
    public void addProduitInCart(ProduitPresentation produit) {
        System.out.println("addproduitInCART ecomCustomer");
        cart.addProduit(produit);
    }
    @Override
    public void viderCaddie() {
        cart.clearProduits();
    }
    @Override
    public void deleteProduitInCart(ProduitPresentation produit){
        cart.deleteProduit(produit);
    }
    @Override
    public FacturePresentation getFactureByIdLogin(int id_facture, String login)throws FinderException, RemoteException{
        facture = factureFacade.getFacture(id_facture, login);
        return null;
        //return new FacturePresentation((int)facture.getIdFacture(),facture.getAcheteur().getLogin(),facture.getDate());
    }
    @Override
    public List<FacturePresentation> getAllFactureByClient(String login)throws FinderException, RemoteException{
        System.out.println("login de l'user : "+login);
        //Client c = accountClientFacade.getClientByLogin(login);
        factures = factureFacade.getAllFactureDuClient(login);
        List<FacturePresentation> lesfactures = new ArrayList<FacturePresentation>();
       
        /* List<String> prod = new ArrayList<String>();
            List<Double> prix = new ArrayList<Double>();
            List<Integer> q = new ArrayList<Integer>();
          for(int i=0;i<factures.size();i++)
          {
              for(int b=0;b<factures.get(i).getPrixProduit();b++){
                prod.add(factures.get(b).getProduitCommande());
                prix.add(factures.get(b).getPrixProduit());
                q.add(factures.get(b).getQuantiteProduit());
             }
           lesfactures.add(new FacturePresentation(factures.get(i).getClientCommande(), factures.get(i).getDate(), prod, prix, q));
           prod.clear();
           prix.clear();
           q.clear();
          }   */
       
       
        return null;//lesfactures;
    }
    @Override
    public List<FacturePresentation> getAllFactureBetweenToDateByClient(Date dateDebut, Date dateFin, String login)throws FinderException, RemoteException{
        factures = factureFacade.getAllFactureBetweenToDateByClient(dateDebut, dateFin, login);
        List<FacturePresentation> lesfactures = new ArrayList<FacturePresentation>();
        for(Facture cust:factures){
            //lesfactures.add(new FacturePresentation((int)cust.getIdFacture(), cust.getAcheteur().getLogin(), cust.getDate()));
        }
        return null;//lesfactures;
    }

    @Override
    public int nombreProduitInCart() {
        return cart.nombreProduit();
    }

    @Override
    public List<ProduitPresentation> getProduitDuPanier() {
        return cart.getProduitDuPanier();
    }

    @Override
    public String getCurrencyRealName(String currencySymbol){
        return convertor.currencyRealName(currencySymbol);
    }
    
    @Override
    public List<String> getCurrencySymbols(){
        return convertor.currencySymbols();
    } 


    @Override
    public void clearProduitDuPanier() {
        cart.clearProduits();
    }

    @Override
    public List<Double> getPrixProduits() {
        return cart.getPrixProduits();
    }

    @Override
    public double getPrixTotal() {
        return cart.getPrixTotal();
    }

    @Override
    public void addFacture(FacturePresentation facturePresentation) throws CreateException, FinderException, RemoteException {
        System.out.println("ajouter la facture");
               
        facture = new Facture();
        facture.setClientCommande(facturePresentation.getClient());
        System.out.println(facturePresentation.getPrix().size());
        for(int i=0; i<facturePresentation.getPrix().size();i++){
            Calendar c = Calendar.getInstance();
            Date d = new Date();
            System.out.println(d.toString());
            Date a = new java.sql.Date(d.getTime());
            
            facture.setDate(a);
            facture.setPrixProduit(facturePresentation.getPrix().get(i));
            facture.setProduitCommande(facturePresentation.getProduits().get(i));
            facture.setQuantiteProduit(facturePresentation.getQuantite().get(i));
            
            System.out.println("!!!!!!! facture à insérer !!!!!!");
            factureFacade.addUneFacture(facture);
            Produit prd =  productFacade.getProduitByName(facturePresentation.getProduits().get(i), "local");
            int quantite = prd.getQuantite() - facturePresentation.getQuantite().get(i);
            prd.setQuantite(quantite);
            if(prd != null) {
                System.out.println("mise à jour  afaire");
                productFacade.updateProduit(prd);
            }
            System.out.println("mise à jour produit");
            //factureFacade
                    System.out.println("affiche i "+i);
        }/*
        Calendar c = Calendar.getInstance();
            Date d = new Date();
            System.out.println(d.toString());
            Date a = new java.sql.Date(d.getTime());
        
                facture.setDate(a);
            facture.setPrixProduit(0);
            facture.setProduitCommande("Romain");
            facture.setQuantiteProduit(1);
            
        factureFacade.addUneFacture(facture);
        try {
            Thread.sleep(6000);
        } catch (InterruptedException ex) {
            Logger.getLogger(EcomCustomer.class.getName()).log(Level.SEVERE, null, ex);
        }
        Calendar t = Calendar.getInstance();
            Date y = new Date();
            System.out.println(d.toString());
            Date z = new java.sql.Date(y.getTime());
            
        Facture facture1 = new Facture();
        facture1.setDate(a);
            facture1.setPrixProduit(10);
            facture1.setProduitCommande("Ouissem");
            facture1.setQuantiteProduit(4);
            facture1.setClientCommande(null)
         factureFacade.addUneFacture(facture1);
 */
    }

    @Override
    public FacturePresentation getFactureByLoginDate(String login, Date date) throws FinderException, RemoteException {
        FacturePresentation fp = new FacturePresentation();
        Facture f  = factureFacade.getFactureByClientDate(login, date);
       // fp.setClient(f.getAcheteur().getLogin());
      //  fp.setId_facture(f.getIdFacture());
        fp.setDate(f.getDate());
        return fp;
    }

    

}
